package main

import (
	"fmt"
	"time"
	"runtime"
)

/**
Goexit()用于退出协程
 */

 /**
 什么都不加执行顺序是：
 	aaaaaaaaaaaaa
	dddddddddddddddddd
	ccccccccccccccccc
	bbbbbbbbbbbbbbbbb
 在testA里加一个return，顺序是：
	aaaaaaaaaaaaa
	ccccccccccccccccc
	bbbbbbbbbbbbbbbbb
 因为testA里面走不完defer就return了，走不到下边打印dddd的地方，所以ddd没有打印出来
 在testA里加Goexit()，顺序是
	 aaaaaaaaaaaaa
	ccccccccccccccccc
 以为程序走到testA里的defer之后，执行了Goexit()，导致整个协程退出了，所以只有aaaa，和cccccc，dddd在Goexit()之后，所以不会打印，bbbb属于子协程的操作，子协程退出，
 bbbb自然也不会打印
  */

func testA()  {
	defer fmt.Println("ccccccccccccccccc")
	//return //终止此函数
	runtime.Goexit()//终止此协程，即退出main函数里的匿名函数
	fmt.Println("dddddddddddddddddd")
}

func main()  {
	go func() {
		fmt.Println("aaaaaaaaaaaaa")

		//调用其他函数
		testA()

		fmt.Println("bbbbbbbbbbbbbbbbb")
	}()

	//无实际意义，只是为了让程序不退出
	for  {
		time.Now()
	}
}
